package com.epalmpay.controller.ys.oilcard;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.epalmpay.commom.BaseController;
import com.epalmpay.entity.TradeOffline;
import com.epalmpay.entity.YsOilcardOrder;
import com.epalmpay.enumdef.BizEnum;
import com.epalmpay.service.member.IMemberService;
import com.epalmpay.service.prepurchase.IPrePurchaseService;
import com.epalmpay.service.weixin.IWxApiWalletService;
import com.epalmpay.service.yunstream.IOilcardOrderService;
import com.epalmpay.util.payplat.DateUtils;
import com.epalmpay.util.payplat.MapUtil;
import com.epalmpay.util.DateUtil;
import com.epalmpay.util.SysUtils;



@Controller
@RequestMapping(value = "/oilCardPay")
public class FlowOrderNotifyController extends BaseController {
	/*
	 * * 功能：支付宝服务器异步通知页面 版本：3.3 日期：2012-08-17 说明：
	 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
	 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
	 * 
	 * //***********页面功能说明*********** 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
	 * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
	 * 该页面调试工具请使用写文本函数logResult，该函数在com.alipay.util文件夹的AlipayNotify.java类文件中
	 * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
	 * //********************************
	 */
	@Resource
	private IOilcardOrderService oilcardOrderService;
	@Resource
	private IMemberService memberService;
	
	 @Resource
	private IWxApiWalletService wxApiWalletServiceService;
	 
	 @Resource
	 private IPrePurchaseService prePurchaseService;
	


	private static Logger logger = LogManager.getLogger(FlowOrderNotifyController.class.getName());

	@RequestMapping("/alipay/notify")
	public ModelAndView alipayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		// 商户订单号

		String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

		// 支付宝交易号

		String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

		// 交易状态
		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

		// 交易金额
		String total_fee = new String(request.getParameter("total_fee").getBytes("ISO-8859-1"), "UTF-8");
		logger.info(
				"alipay callBack info: out_trade_no=" + out_trade_no + ";trade_no=" + trade_no + ";trade_status=" + trade_status + ";total_fee=" + total_fee);

		// 获取支付宝POST过来反馈信息
		HashMap<String, String> params = new HashMap<String, String>();
		Map requestParams = request.getParameterMap();
		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
			// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
			params.put(name, valueStr);
		}
		//
		
		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
		if (oilcardOrderService.verfyOilCardAliPay(params,out_trade_no)) {// 验证成功
			//////////////////////////////////////////////////////////////////////////////////////////
			// 请在这里加上商户的业务逻辑程序代码

			// ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			logger.info(
					"alipay callBack info: 验签名成功");


			if (trade_status.equals("TRADE_SUCCESS")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				// 如果有做过处理，不执行商户的业务程序

				// 注意：
				// 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
				
				YsOilcardOrder oilcardOrder =oilcardOrderService.findOilOrderInfo(out_trade_no);
				if(oilcardOrder==null){
					logger.info(
							"alipay callBack info: YsOilcardOrder 查询失败");
					return null;
				}
				oilcardOrder.setPaymentAmount(Math.round(Float.parseFloat(total_fee)*100));
				oilcardOrder.setPaymentOrderId(trade_no);
				oilcardOrder.setPaymentTime(new Date());
				boolean  result = oilcardOrderService.paySuccessCommon(oilcardOrder,BizEnum.PaymentType.AliPay.getType());
				if (result ) {
					//支付宝 油卡 消费 通知
					wxApiWalletServiceService.finishBuySendMessage(oilcardOrder.getPayOrderId(),"油卡购买");			
					memberService.insertMemberTradeDataAsyn(oilcardOrder.getMemberId(), oilcardOrder.getPaymentAmount());
					Map<String ,String> t=oilcardOrderService.oilCardRecharge(out_trade_no);
					response.getOutputStream().println("success");
				}
			}

			// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

			// out.println("success"); //请不要修改或删除

			//////////////////////////////////////////////////////////////////////////////////////////
		} else {// 验证失败
			response.getOutputStream().println("fail");
		}
		return null;
	}

	/**
	 * 改变数据使用
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/alipay/adminNotify")
	public @ResponseBody  Map<String ,String>  adminNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String tradeStatus=request.getParameter("tradeStatus");
		String outTradeNo= request.getParameter("outTradeNo");
		String adminKey= request.getParameter("adminKey");
		if ("TRADE_SUCCESS".equals(tradeStatus)&&"admin".equals(adminKey)) {
			// 判断该笔订单是否在商户网站中已经做过处理
			// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
			// 如果有做过处理，不执行商户的业务程序

			// 注意：
			// 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
			
			YsOilcardOrder order =oilcardOrderService.findOilOrderInfo(outTradeNo);
			if(order==null){
				return null;
			}
			memberService.insertMemberTradeDataAsyn(order.getMemberId(), order.getPaymentAmount());
			return oilcardOrderService.oilCardRecharge(outTradeNo);
		}
		return null;
	}
	
	
	/**
	 * 改变支付状态数据使用
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/alipay/adminPayNotify")
	public @ResponseBody  Map<String ,String>  adminPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String tradeStatus=request.getParameter("tradeStatus");
		String outTradeNo= request.getParameter("outTradeNo");
		String trade_no= request.getParameter("tradeNo");
		String adminKey= request.getParameter("adminKey");
		if ("TRADE_SUCCESS".equals(tradeStatus)&&"admin".equals(adminKey)) {
			YsOilcardOrder oilcardOrder =oilcardOrderService.findOilOrderInfo(outTradeNo);
			if(oilcardOrder==null){
				logger.info(
						"alipay callBack info: YsOilcardOrder 查询失败");
				return null;
			}
			oilcardOrder.setPaymentOrderId(trade_no);
			oilcardOrder.setPaymentTime(new Date());
			boolean  result = oilcardOrderService.paySuccessCommon(oilcardOrder,null);
			if (result ) {
				//支付宝 油卡 消费 通知
				wxApiWalletServiceService.finishBuySendMessage(oilcardOrder.getPayOrderId(),"油卡购买");			
				memberService.insertMemberTradeDataAsyn(oilcardOrder.getMemberId(), oilcardOrder.getPaymentAmount());
				Map<String ,String> t=oilcardOrderService.oilCardRecharge(outTradeNo);
				response.getOutputStream().println("success");
			}
		}
		return null;
	}
	
	
	/**
	 * 改变数据使用
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/alipay/adminStartOilStaticTask")
	public @ResponseBody  Map<String ,String>  adminStartOilStaticTask(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String tradeStatus=request.getParameter("tradeStatus");
		String statisDate= request.getParameter("statisDate");
		String adminKey= request.getParameter("adminKey");
		if ("TRADE_SUCCESS".equals(tradeStatus)&&"admin".equals(adminKey)) {
			// 判断该笔订单是否在商户网站中已经做过处理
			// 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
			// 如果有做过处理，不执行商户的业务程序

			// 注意：
			// 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
			
			oilcardOrderService.saveOilChargeDayStatis(SysUtils.parseDate(statisDate, "yyyy-MM-dd"));
			oilcardOrderService.saveFlowChargeDayStatis(SysUtils.parseDate(statisDate, "yyyy-MM-dd"));
		}
		return null;
	}
	
	/**
	 * 改变数据使用
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/alipay/merchSettedNotify")
	public @ResponseBody  Map<String ,String>  merchSettedNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String date=request.getParameter("date");
		String adminKey= request.getParameter("adminKey");
		Map<String,String> result= new HashMap();
		if ("admin".equals(adminKey)) {
			prePurchaseService.finishPrePursMerchantSetted(SysUtils.parseDate(date, "yyyy-MM-dd"));
			result.put("result", "success");
		}else{
			result.put("result", "fail");
		}
		
		return result;
	}
	
	
	
	@RequestMapping("/alipay/flowsOrderNotify")
	public ModelAndView flowsOrderNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		// 商户订单号

		String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

		// 支付宝交易号

		String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

		// 交易状态
		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

		// 交易金额
		String total_fee = new String(request.getParameter("total_fee").getBytes("ISO-8859-1"), "UTF-8");
		logger.info(
				"alipay callBack info: out_trade_no=" + out_trade_no + ";trade_no=" + trade_no + ";trade_status=" + trade_status + ";total_fee=" + total_fee);

		// 获取支付宝POST过来反馈信息
		HashMap<String, String> params = new HashMap<String, String>();
		Map requestParams = request.getParameterMap();
		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
			// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
			params.put(name, valueStr);
		}

		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
		if (oilcardOrderService.verfyFlowChargeAliPay(params,out_trade_no)) {// 验证成功
			//////////////////////////////////////////////////////////////////////////////////////////
			// 请在这里加上商户的业务逻辑程序代码

			try {
				// 获取请求数据

				if (trade_status.equals("TRADE_SUCCESS"))  {
					// 签名验		  price
				    int price=Math.round(Float.parseFloat(total_fee)*100);
				    TradeOffline  tradeOffline=oilcardOrderService.finishFlowsPayNotify(trade_no,out_trade_no);
					response.getOutputStream().println("success");
					wxApiWalletServiceService.finishBuySendMessage(tradeOffline.getId(),"流量购买");	
				}

			} catch (IOException e) {
			
				e.printStackTrace();
			}
			// ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

			// out.println("success"); //请不要修改或删除

			//////////////////////////////////////////////////////////////////////////////////////////
		} else {// 验证失败
			response.getOutputStream().println("fail");
		}
		return null;
	}
	
	
	
	@RequestMapping("/weixinpay/notify")
	public ModelAndView weixinpayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		// 商户订单号
		try {
			// 获取请求数据
			Map<String, String> map = MapUtil.parseXml(request);
			map = MapUtil.order(map);
			
			logger.info(MapUtil.mapJoin(map, false, false));
			if ("SUCCESS".equalsIgnoreCase( map.get("result_code"))) {
				// 签名验
				YsOilcardOrder oilcardOrder =oilcardOrderService.findOilOrderInfo(map.get("out_trade_no"));
				if(oilcardOrder==null){
					logger.info(
							"weixinpayNotify callBack info: YsOilcardOrder 查询失败");
					return null;
				}
				oilcardOrder.setPaymentAmount(SysUtils.Object2Integer(map.get("total_fee")));
				oilcardOrder.setPaymentOrderId(map.get("transaction_id"));
				oilcardOrder.setPaymentTime(DateUtils.stringForDate(map.get("time_end"), "yyyyMMddHHmmss"));
				boolean result = oilcardOrderService.paySuccessCommon(oilcardOrder,BizEnum.PaymentType.WebChat.getType());
				if (result) {
					wxApiWalletServiceService.finishBuySendMessage(oilcardOrder.getPayOrderId(),"油卡购买");	
					
					memberService.insertMemberTradeDataAsyn(oilcardOrder.getMemberId(), oilcardOrder.getPaymentAmount());
					 Map<String ,String> t=oilcardOrderService.oilCardRecharge(map.get("out_trade_no"));					
				}
				response.getOutputStream().write(getNotifyMessage().getBytes());
			}

		} catch (IOException e) {
		
			e.printStackTrace();
		}
		

		
		return null;
	}
	
	

	
	@RequestMapping("/weixinFlows/notify")
	public ModelAndView weixinFlowsNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		// 商户订单号
		try {
			// 获取请求数据
			Map<String, String> map = MapUtil.parseXml(request);
			map = MapUtil.order(map);
			
			logger.info(MapUtil.mapJoin(map, false, false));
			if ("SUCCESS".equalsIgnoreCase( map.get("result_code"))) {
				// 签名验  price
								
				String tradeNo =map.get("transaction_id");
				String outTradeNo=map.get("out_trade_no");
				Integer price=SysUtils.Object2Integer(map.get("total_fee"));
				TradeOffline  tradeOffline=oilcardOrderService.finishFlowsPayNotify(tradeNo,outTradeNo);
				wxApiWalletServiceService.finishBuySendMessage(tradeOffline.getId(),"流量购买");	
				response.getOutputStream().write(getNotifyMessage().getBytes());
			}

		} catch (IOException e) {
		
			e.printStackTrace();
		}
		return null;
	}
	
	
	
	private String getNotifyMessage() {
		return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
	}
}
